package com.zpz.framework.zpzoauth.common.extend;

import java.math.BigDecimal;

//import com.sun.tools.internal.ws.wsdl.document.jaxws.Exception;

/**
 * 金融计算扩展
 *
 * @author zhangpanzhi
 * @version 创建时间：2017年7月4日 下午5:12:17
 */
public class FinanceExtend {
    public static double add(double a, double b) {
        return add(a, b, -1);
    }

    /**
     * 加（精确计算）
     *
     * @param a
     * @param b
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double add(double a, double b, int scale) {
        BigDecimal v1 = new BigDecimal(a);
        BigDecimal v2 = new BigDecimal(b);
        BigDecimal r = v1.add(v2);
        if (scale < 1)
            return r.doubleValue();

        //四舍五入,保留 scale 位小数
        return r.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


    /**
     * 减法（精确计算）
     *
     * @param a
     * @param b
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double subtract(double a, double b) {
        return subtract(a, b, -1);
    }

    /**
     * 减法（精确计算）
     *
     * @param a
     * @param b
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double subtract(BigDecimal a, BigDecimal b) {
        return subtract(a, b, -1);
    }

    /**
     * 减法（精确计算）
     *
     * @param a
     * @param b
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double subtract(double a, double b, int scale) {
        BigDecimal v1 = new BigDecimal(a);
        BigDecimal v2 = new BigDecimal(b);
        return subtract(v1, v2, scale);
    }

    /**
     * 减法（精确计算）
     *
     * @param v1
     * @param v2
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double subtract(BigDecimal v1, BigDecimal v2, int scale) {
        BigDecimal r = v1.subtract(v2);
        if (scale < 1)
            return r.doubleValue();

        //四舍五入,保留 scale 位小数
        return r.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 乘法
     *
     * @param a
     * @param b
     * @return
     * @author zhangpanzhi 2017年7月11日
     */
    public static double multiply(double a, double b) {
        return multiply(a, b, -1);
    }

    /**
     * 乘法
     *
     * @param a
     * @param b
     * @return
     * @author zhangpanzhi 2017年7月11日
     */
    public static double multiply(BigDecimal a, BigDecimal b) {
        return multiply(a, b, -1);
    }

    /**
     * 乘法（精确计算）
     *
     * @param a
     * @param b
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double multiply(double a, double b, int scale) {
        BigDecimal v1 = new BigDecimal(a);
        BigDecimal v2 = new BigDecimal(b);
        return multiply(v1, v2, scale);
    }

    /**
     * 乘法（精确计算）
     *
     * @param v1
     * @param v2
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double multiply(BigDecimal v1, BigDecimal v2, int scale) {
        BigDecimal r = v1.multiply(v2);
        if (scale < 1)
            return r.doubleValue();

        //四舍五入,保留 scale 位小数
        return r.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


    /**
     * 除法（精确计算）
     *
     * @param a
     * @param b
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double divide(double a, double b, int scale) {
        if (scale <= 0)
            throw new RuntimeException("精确度不能小于0");
        BigDecimal v1 = new BigDecimal(a);
        BigDecimal v2 = new BigDecimal(b);
        //四舍五入,保留 scale 位小数
        BigDecimal r = v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);

        return r.doubleValue();
    }

    /**
     * 四舍五入
     *
     * @param a
     * @param scale 精度（四舍五入）
     * @return
     * @author zhangpanzhi 2017年7月4日
     */
    public static double round(double a, int scale) {
        if (scale <= 0)
            throw new RuntimeException("精确度不能小于0");
        //四舍五入,保留 scale 位小数
        BigDecimal r = new BigDecimal(a);
        return r.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
